// 实验2 队列通讯

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_log.h"

// 1. 创建队列
QueueHandle_t my_queue_handle = NULL;

// 2. 创建数据结构
typedef struct
{
    int value;
} queue_data_t;

// 3. 接收数据进程
void taskA(void *param)
{
    queue_data_t data; // 缓冲
    int count = 0;
    while (1)
    {
        if (pdTRUE == xQueueReceive(my_queue_handle, &data, 10))   // 接收数据
        {
            ESP_LOGI("queue", "receive queue value: %d", data.value);
            count = 0;
        }
        else
        {
            ESP_LOGI("taskA", "no data! COUNT = %d", count++);
        }
    }
}

// 4. 发送数据进程
void taskB(void *param)
{
    queue_data_t data; // 缓冲(原始数据)
    data.value = 0;
    while (1)
    {
        data.value++;
        xQueueSend(my_queue_handle,&data,100);  // 发送数据
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

void app_main(void)
{
    // 0. 创建队列!
    my_queue_handle = xQueueCreate(10, sizeof(queue_data_t));
    // 10是这个队列最多几个元素，第二个参数是一个元素的字节大小

    xTaskCreatePinnedToCore(taskA, "taskA", 2048, NULL, 3, NULL, 1);
    xTaskCreatePinnedToCore(taskB, "taskB", 2048, NULL, 3, NULL, 1);
}
